"""author: wenyao
   data: 2021/4/8
   project: devopscmdb
"""
#计算机能识别的只是二进制
#二进制就是机器语言
#文字就是人类语言
#有一个转换过程

#编码  人类语言与机器语言的一种映射关系

#ascii码  对英文字符进行编码
#unicode 编码 万国码 基本上所有的文字都给一个编码

#python2 默认编码是ascii码
#python3 默认编码是utf-8

#utf-8 utf-16 utf-32 都是unicode的具体实现方式
#utf-8
#一个英文字符占一个字节
#一个中文字符占三个字节
#gbk
#一个字符占2个字节

#如果中文比较多，使用gbk

#查看编码
# >>> ord("你")
# 20320
# >>> bin(20320)
# '0b100111101100000'
# >>> ord("a")
# 97
# >>> ord("A")
# 65
# >>> str1 = "中文"
# >>> str1.encode("utf-8")
# b'\xe4\xb8\xad\xe6\x96\x87'
# >>> str1.encode("gbk")
# b'\xd6\xd0\xce\xc4'

#######################以什么方式加码，就以什么方式解码############
# >>> str1.encode("utf-8")
# b'\xe4\xb8\xad\xe6\x96\x87'
# >>> b'\xe4\xb8\xad\xe6\x96\x87'.decode("utf-8")
# '中文'
# >>> str1.encode("utf-8").decode("gbk")
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 2: illegal multibyte sequence
# >>> str1.encode("gbk").decode("utf-8")
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd6 in position 0: invalid continuation byte


#如果文件加码和解码的方式不一致，就会出现乱码情况


#####################文件操作###########################
#open
# 打开文件（open）
# • file : 要打开的文件名( str )
# • mode: 打开文件的方式( str ) => text, bytes
# • encoding: 文件编码方式（str）
# • errors: 当发生编码错误时的处理方式（str） 'ignore'或'strict'(默认)
# • buffering: 缓存方式 ( int）

# fp = open("test.txt")
# print(fp.read())

##########encoding
#linux和windows之间传输文件
# [root@sdyxz encod-test]# yum install lrzsz
# [root@sdyxz encod-test]# sz utf-8.txt

#linux转换文件编码的命令
#[root@sdyxz encod-test]# iconv -f utf-8 -t gbk gbk.txt > gbk2.txt

#open函数 encoding 没有指定默认为 None  表示使用系统的编码方式打开文本

# >>> fp = open("utf-8.txt")
# >>> fp.read()'这是utf-8\n\n'
# >>> fp2 = open("gbk2.txt")
# >>> fp2.read()
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
#   File "/usr/lib64/python3.6/codecs.py", line 321, in decode
#     (result, consumed) = self._buffer_decode(data, self.errors, final)
# UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd5 in position 0: invalid continuation byte
# >>> fp2 = open("gbk2.txt")
# >>> fp2 = open("gbk2.txt", encoding="gbk")
# >>> fp2.read()
# '这是Gbk\n'

# fp = open("utf-8.txt")
# print(fp.read())
# fp = open("gbk2.txt")
# print(fp.read())

#检测文件编码
# import chardet
# fp = open("utf-8.txt","rb")  #要以二进制的方式打开
# print(chardet.detect(fp.read()))
# fp2 = open("gbk2.txt","rb")
# print(chardet.detect(fp2.read()))

###################文件打开方式 mode
#文件打开方式 读  写  读写
#文本类型打开 还是以 二进制类型打开
#默认打开方式 就是只读
#r 只读
#w 覆盖写

# fp = open("test.txt")
# print(fp.read())
# fp.write("aa")
#
# fp = open("test.txt",mode="w")
# #print(fp.read())
# fp.write("aa")
# fp2 = open("test.txt","a")
# #print(fp.read())
# fp2.write("aa")
# fp3 = open("test.txt","r+")
# print(fp3.read())
# fp3.write("this is test")
# fp3.close()

############with语句去管理
#自动关闭连接，回收资源
# with open("test.txt") as fp:
#     print(fp.read())

#############文件的读取
#注意光标的位置
#都是从光标位置开始读
#f.seek(cookie, whence=0)
#移动光标位置 cookie=> 偏移量 whence=> 相对位置 (0-> 开始, 1->当前, 2->末尾)
#注意：1、2只能用b模式打开才 可以

# fp = open("test.txt")
# print(fp.read(3))
# print("***************")
# print(fp.read())
# #
# #fp.seek()挪动光标位置
# #fp.tell()告诉光标位置
# fp.seek(2)
# print(fp.tell())
# print(fp.read())

#用a+的方式打开文件的话，光标默认在文件末尾
# fp = open("test.txt","a+")
# fp.seek(0)
# print(fp.read())
#
# fp = open("test.txt","rb")
# fp.seek(-5,2)
# print(fp.read())

#读取方法
#fp.read() 返回当前光标位置到文末的文本  也可以指定字符数读取
#fp.readline()  返回光标到行末
#fp.rednlines()  返回当前光标到文末的内容，每行为一个元素，返回一个列表

# fp = open("test.txt", encoding="utf-8")
# print(fp.read(4))
# print(fp.read())
# print(fp.readline())
# print(fp.readline())
# print(fp.readlines())


#处理大文件
#1、for i in fp
#      每次迭代获取一行数据
#2、fp.read(1024)

# with open('test.txt', 'rb') as f:
#     # 读前五行
#     print('#####读前五行##########')
#     for i in range(5):
#         print(f.readline().decode('UTF-8'), end='')
#     # for i in f:
#     #     print(i.decode("utf-8"))
#     f.seek(0)
#     print('#####读全文#####')
#     print(f.read().decode('UTF-8'))
#     f.seek(-12, 2)
#     print('######读取最后12字节########')
#     print(f.read().decode('UTF-8'))
#     print('######读取最后4个汉字########')
#     f.seek(0, 0)
#     i = 0
#     end_words = []
#     for word in f.read().decode('utf-8')[::-1]:
#         # if word not in (string.ascii_letters + string.digits + string.punctuation):
#         if u'u\4e00' <= word <= u"\u9fff":
#             i += 1
#             if i <= 4:
#                 end_words.append(word)
#             else:
#                 break
#     print(''.join(end_words[::-1]))

# if "a">"b":
#     print("ok")
# else:
#     print("error")

# # 读取一个文件,显示除了以井号(#)开头的行以外的所有行。
# print("########读取一个文件,显示除了以井号(#)开头的行以外的所有行##########")
# with open('test.txt', 'r', encoding='utf-8') as f:
#     for line in f:
#         #line.startswith("#")
#         if line[0] != '#':
#             print(line, end='')
#
# 1.新建一个文件i:\sc.txt
# 写入1000行 hello，sanchuang，i am ***
# with open('sc.txt', 'w', encoding='utf-8') as f:
#     for i in range(1000):
#         f.write("hello,sanchuang,i am zhangrenjie\n")
#
# # 2.读写本地任意一个你准备的文本文件d:\sc.txt，给每一行前面加一个#
# with open('sc.txt', 'r+', encoding='utf-8') as f:
#     lines = f.readlines()
#     f.seek(0)
#     for line in lines:
#         f.write(f"#{line}")
#
#从网络上下载两张图片
# import requests
# result = requests.get("https://www.baidu.com")
# print(result.text)
#print(result.content)

 #   图片地址
# url_wen = 'https://www.sanchuangedu.cn/upload/teacher/%E6%96%87%E7%91%B62.jpg'
# url_feng = 'https://www.sanchuangedu.cn/upload/teacher/feng_llZoGaA.jpg'
#     # 向服务器发送get请求
# request_wen = requests.get(url_wen)
# request_feng = requests.get(url_feng)
#     # 将图片存放当前文件夹，并接收请求 centent 接受请求
# with open('wen.jpg', 'wb') as f:
#     f.write(request_wen.content)
# with open('feng.jpg', 'wb') as f:
#     f.write(request_feng.content)


# with open("test.txt","rb") as f:
#     for i in f:
#         print(id(i))
#         #print("############")

##########################文件的写入############
fp = open("test.txt","a")
fp.write("this is write test!!!!!!!!\n")

#写缓存
#什么时候从缓存写到磁盘
#1、程序退出的时候
#2、fp.close()
#3、fp.flush()  #强制刷到磁盘
#4、缓冲区满
#5、buffering设置


